Tenemos un gran proyecto con muchas dependencias traídas a través de Carthage. Cada vez que intentamos mirar una variable en el depurador lldb ( p variablename ), nos da un error: error: Couldn't IRGen expression, no additional error
Ninguna de las soluciones es muy buena. Podemos ejecutar Carthage con --no-use-binaries para evitarlo, pero hace que las compilaciones tomen un tiempo prohibitivo. Podemos usar fr v en algunas variables, pero no en todas. La gente solucionó esto en versiones anteriores de Xcode cambiando los permisos en algunos directorios de Swift, pero no puedo encontrar los directorios correspondientes en Xcode 10.1. Y vi a alguien decir que cambiar el sistema de compilación de un lado a otro lo ayudó, pero eso no funcionó para nosotros.
Así que estoy comenzando esta búsqueda de una solución en Xcode 10.1 específicamente. ¿Alguien más ha descubierto qué está causando este error y/o una buena solución?
Alguien en mi equipo compartió una solución para esto que realmente funciona (no sé si lo descubrió o lo encontró en otro lado):
Establezca un punto de interrupción en la primera línea del método AppDelegate didFinishLaunchingWithOptions . Establezca la acción para este punto de interrupción en: po application
Ahora, cuando ejecute su aplicación, el depurador se detendrá en ese punto de interrupción y mostrará este texto en el panel del depurador lldb (con el nombre de su aplicación en lugar de Foo):
nota: las opciones del compilador Swift para Foo entran en conflicto con las opciones que se encuentran en otros módulos; Al cambiar a un nuevo evaluador de expresiones para Foo, las antiguas variables $R se pierden.
Y luego el depurador lldb funcionará correctamente, capaz de p y po variables y expresiones expr .
No sé por qué funciona, pero funciona, ¡y también de manera confiable!
Un colega y yo encontramos una solución:
Cree un archivo Objective-C en su proyecto Swift. Presiona sí cuando te pregunte por el encabezado de puente.
Test.h
#import <Foundation/Foundation.h> @interface Test : NSObject - (id)init; @end Test.m
#include "Test.h" @implementation Test - (id)init { return self; } @end MyProject-Bridging-Header.h
#include "Test.h" Y ahora: 🎉 no más error: Couldn't IRGen expression, no additional error y puede depurar nuevamente.
Así que creo que solo agregar un encabezado de puente funciona como una solución ...
Pero si eso no funciona:
Agregue un punto de interrupción en AppDelegate.swift en application: UIApplication, didFinishLaunching así y espero que esto ayude:
Actualmente existe un requisito estricto de que la versión del compilador Swift que usa para construir su código fuente y la versión de lldb que usa para depurarlo deben provenir de la misma cadena de herramientas. Actualmente, la información de depuración rápida para los tipos es solo una serialización de las estructuras de datos internas del compilador rápido. También depende de la información de la ruta local, lo que dificulta moverse.
Hay un esfuerzo a más largo plazo para cambiar ese diseño, pero por ahora tiene que reconstruir todos sus archivos binarios cada vez que actualiza sus herramientas y no puede usar archivos binarios prediseñados.
Sin embargo, estoy un poco sorprendido de que esto cause un problema diario. Esta reconstrucción completa solo debe ocurrir cuando obtiene nuevas fuentes de Carthage o actualiza sus herramientas, lo que no debería ser tan frecuente. Si está desencadenando reconstrucciones con más frecuencia que eso, tal vez las dependencias no se rastrean correctamente, por lo que se reconstruyen más archivos de los necesarios.